/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

package clases;

import java.util.ArrayList;
import java.util.Iterator;
import java.util.logging.Level;
import java.util.logging.Logger;

/**
 *
 * @author Joaquin
 */
public class Cliente extends Thread {

    /**
     * Datos del Cliente
     */
    private String nombre;
    /**
     * Vector de vehiculos (max=5)
     */
    private ArrayList<Vehiculo> vehiculosRotos;
    private Vehiculo vehiculoEnReparacion;
    private ArrayList<Vehiculo> vehiculosArreglados;
    /**
     * Recepcionista
     */
    private Recepcionista recepcionista;

    public Cliente(String nombre, Recepcionista recepcionista) {
        super();
        this.nombre = nombre;
        this.vehiculosRotos = new ArrayList();
        this.vehiculosArreglados = new ArrayList();
        this.recepcionista = recepcionista;

        // obtenemos una cantidad al azar de vehiculos para el Cliente
        int cantidad = (int)(Math.random()*5);
        System.out.println(this.nombre+": Vamos a crear " + cantidad + " vehiculos");

        // creamos los vehiculos del Cliente
        for (int i=0; i<cantidad; i++) {
            if (Math.random() > 0.7) {
                this.vehiculosRotos.add(new Bicicleta(Vehiculo.AGREE, 26));
            }
            else {
                this.vehiculosRotos.add(new Moto(Vehiculo.AGREE, 2));
            }
        }
    }

    @Override
    public void run() {
        while (hayRotos() || hayEnReparacion()) {
            // calculamos el tiempo a dormir, entre 15 y 21 segundos
            int tiempo = (int)(Math.random()*6000+15000);
            System.out.println(this.nombre+": Como hay " + this.vehiculosRotos.size() +
                    " rotos, " + (hayEnReparacion()?"1":"0") +
                    " en reparacion  y " + this.vehiculosArreglados.size() +
                    " arreglados, dormimos " + tiempo);

            /**
             * si hay un vehiculo roto se lo damos al recepcionist y lo
             * colocamos como vehiculo en reparacion
             */
            if (hayRotos()) {
                Iterator<Vehiculo> iterador = this.vehiculosRotos.iterator();
                Vehiculo vehiculoRoto = iterador.next();
                iterador.remove();
                this.recepcionista.recibirVehiculo(vehiculoRoto);
                this.vehiculoEnReparacion = vehiculoRoto;
            }

            // una vez que dejamos el vehiculo esperamos
            try {
                sleep(tiempo);
            } catch (InterruptedException ex) {
                Logger.getLogger(Cliente.class.getName()).log(Level.SEVERE, null, ex);
            }

            // intentamos buscar el vehiculo reparado
            if (hayEnReparacion()) {
                Vehiculo vehiculoReparado = recepcionista.obtenerVehiculoReparado(vehiculoEnReparacion.getCodigo());
                this.vehiculoEnReparacion = null;
                this.vehiculosArreglados.add(vehiculoReparado);
            }

            // mostramos el estados
            System.out.println(this.toString());
        }

        // no tenemos vehiculos para reparar!
        System.out.println(this.nombre + " está muy agradecido por los servicios! \n");
    }

    private boolean hayRotos() {
        return !this.vehiculosRotos.isEmpty();
    }

    private boolean hayEnReparacion() {
        return this.vehiculoEnReparacion!=null;
    }

    private boolean hayArreglados() {
        return !this.vehiculosArreglados.isEmpty();
    }

    @Override
    public String toString() {
        String retorno = this.nombre+": " + this.nombre + "\n";

        retorno += "Vehiculos Rotos: \n";
        Iterator<Vehiculo> iteradorRotos = this.vehiculosRotos.iterator();
        while (iteradorRotos.hasNext()) {
            retorno += iteradorRotos.next().toString() + "\n";
        }

        retorno += "Vehiculo en Reparacion: " + this.vehiculoEnReparacion + "\n";

        retorno += "Vehiculos Reparados: \n";
        Iterator<Vehiculo> iteradorArreglados = this.vehiculosArreglados.iterator();
        while (iteradorArreglados.hasNext()) {
            retorno += iteradorArreglados.next().toString() + "\n";
        }
        
        return retorno;
    }

}
